package com.book;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 * Created by Admin on 9/19 0019.
 */
@Service("bookShopService")
public class BookShopServiceImp implements BookShopService {
    @Autowired
    private BookShopDao bookShopDao=null;

    /**
     * 添加事务注解
     * 事务的传播行为:
     * 使用propagation 指定事务的传播行为,即当前的事务方法被另一个事务方法调用时
     * 如何使用事务,默认取值为 REQUIRED , 即使用调用方法的事务
     * (随波逐流)
     * REQUIRED_NEW : 事务自己的事务,调用的事务方法的事务被挂起
     * (保留自己原有的事务,不同流合污)
     *事务的隔离级别:
     * 使用isolation 指定事务的隔离级别,最常用的取值为READ_COMMITTED
     * 默认情况下Spring 的声明事务对所有的运行时异常进行回滚,也可以通过
     * 事务的回滚属性:
     * 对应的属性进行设置;通常情况下默认值即可(事务的回滚属性)
     *事务的只读属性:
     *使用readOnly 指定事务是否为只读:表示这个事务只读取数据但不更新数据;
     * 这样可以帮助数据库引擎优化事务
     *事务的过期属性:
     * 使用timeout :指定强制回滚之前事务可以占用的时间
     *
     * @param username
     * @param isbn
     */
    @Transactional(propagation = Propagation.REQUIRED,
            isolation = Isolation.READ_COMMITTED)
    public void getBook(String username, String isbn) {
        //1.获取价格
        int price=bookShopDao.queryPriceByIsbn(isbn);
        //2.更新库存
        bookShopDao.updateBookStock(isbn);
        //3.更新余额
        bookShopDao.updateUserAccount(username,price);

    }
}
